package us.kg.kotoriforest.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import us.kg.kotoriforest.spring.pojo.DataSourceWrapper;

@SpringBootApplication
// 项目名+Application
// SpringBoot自带ComponentScan注解，会扫描主程序类所在包及其子包下的所有组件
// 如果手动写了ComponentScan注解，会覆盖SpringBoot自带的ComponentScan注解
public class SpringIocApplication {

    // public static void main(String[] args) {
    //     // ApplicationContext是普通java项目的IOC容器
    //     // WebApplicationContext是web项目的IOC容器
    //     ConfigurableApplicationContext IOC = SpringApplication.run(SpringIocApplication.class, args);
    //
    //     // String[] beans = IOC.getBeanDefinitionNames();
    //     // for (String bean : beans) {
    //     //     System.out.println("bean name is " + bean);
    //     // }
    //
    //     // 根据组件的id和类型来获取组件
    //     // User user = (User) IOC.getBean("user");
    //     // System.out.println(user);
    //
    //     // User user = IOC.getBean(User.class);
    //     // System.out.println(user);
    //
    //     // 根据组件类型获取组件集合
    //     // Map<String, User> users = IOC.getBeansOfType(User.class);
    //     // users.forEach((id, user) -> System.out.println(id + " -> " + user));
    //
    //
    // }

    // public static void main(String[] args) {
    //     try (ConfigurableApplicationContext IOC = SpringApplication.run(SpringIocApplication.class, args)) {
    //         // 由框架自动帮我们调用Car的工厂方法
    //         // System.out.println(IOC.getBean(Car.class));
    //
    //         // 工厂Bean产生的对象默认是单例的
    //         // Car car1 = IOC.getBean(Car.class);
    //         // Car car2 = IOC.getBean(Car.class);
    //         // System.out.println(car1 == car2);
    //
    //         // System.out.println(IOC.getEnvironment().getProperty("OS"));
    //         // System.out.println(System.getProperty("os.name"));
    //         //
    //         // IOC.getBeansOfType(User.class).forEach((id, user) -> System.out.println(id + " -> " + user));
    //
    //         // System.out.println(IOC.getBean(Car.class));
    //
    //         // System.out.println(IOC.getBean(UserController.class));
    //
    //         UserServiceImpl userService = IOC.getBean(UserServiceImpl.class);
    //         System.out.println(userService.getBeanName());
    //         System.out.println(userService.getEnvironment().getProperty("OS"));
    //     }
    // }

    // public static void main(String[] args) {
    //     try (ConfigurableApplicationContext IOC = SpringApplication.run(SpringIocApplication.class, args)) {
    //         IOC.getBeansOfType(Dog.class).forEach((id, dog) -> System.out.println(id + " -> " + dog));
    //
    //         URL url = ResourceUtils.getURL("classpath:dog.properties");
    //         System.out.println(url);
    //     } catch (FileNotFoundException e) {
    //         throw new RuntimeException(e);
    //     }
    //
    //     // System.out.println("你是？");
    // }

    public static void main(String[] args) {
        try (ConfigurableApplicationContext IOC = SpringApplication.run(SpringIocApplication.class, args)) {
            // System.out.println(IOC.getBean(Employee.class));
            System.out.println(IOC.getBean(DataSourceWrapper.class));
        }
    }
}
